import java.io.*;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: LianBao
 * Date: 2024-08-14
 * Time: 22:07
 */
public class demo7 {
    //打开文件,其实是在该进程中的"文件描述表"中,创建了一个新的表项,
    //文件描述表描述了该进程需要操作哪些文件,文件描述表可以认为是一个数组,数组的每个元素包含了操作的文件的信息,而数组的下标就称为文件描述符
    //每次打开一个文件就相当于在数组中占据一个位置,数组长度是固定的,必须调用close才能释放空间,否则当数组满了,后面再打开文件就会失败
    //上述问题就叫文件资源泄漏
    public static void main1(String[] args) throws IOException {
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream("./test.txt");//创建对象,创建对象的同时会有一个隐含的操作:打开文件
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            inputStream.close();//关闭文件
        }
    }

    public static void main2(String[] args) {
        //这种方法,不用写close,try里面的{}执行完毕最终会执行close
        try (InputStream inputStream = new FileInputStream("./test.txt")) {
//            inputStream.read();一次读取一个字节,会有多次IO操作,才能读取完毕
//            inputStream.read(byte[] b);进行一次IO,把byte数组尽可能填满
//            inputStream.read(byte[] b,int off,int len);进行一次IO,把byte数组尽可能填满,从数组中[off,off+len)的范围内进行填充
            //上面三种形式,返回值都是int,表示实际读取到的字节数,文件读取完毕就返回-1,不使用byte是因为byte只有0~255,不能表示-1
            while (true) {
                int b = inputStream.read();//读取内容
                if (b == -1) {
                    break;//读取完毕
                }
                System.out.printf("0x%x\n", b);//16进制打印b
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try (InputStream inputStream = new FileInputStream("./test.txt")) {
            while (true) {
                byte[] buffer = new byte[1024];
                int n = inputStream.read(buffer);//一次IO把byte数组尽可能填满,n表示read操作实际读取到多少字节
                if (n == -1) {
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.printf("0x%x\n", buffer[i]);//16进制打印n
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
